home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_100 / 133_01 / e10 < prev    next >
Text File  |  1985-03-09  |  3KB  |  142 lines

  1. /*
  2.     e screen editor
  3.  
  4.     (C) G. Nigel Gilbert, MICROLOGY, 1981
  5.  
  6.     August-December 1981
  7.  
  8.     FILE: e10
  9.  
  10.     FUNCTIONS: fopen,fcreat,fflush,fclose,putc,getc,funlink,
  11.             frename,dskcheck,err1,err2,err3,err4
  12.  
  13.     PURPOSE: file buffer operations extracted and stripped from stdlib1,
  14.         with protection from bdos error crashes added
  15.  
  16. */
  17.  
  18. #include "e.h"
  19.  
  20. int fopen(filename,iobuf)
  21. struct iobuffer *iobuf;
  22. char *filename;
  23. {
  24.     if (dskcheck(setjmp(dskerr)) || (iobuf -> _fd = open(filename,0))<0) return FAIL;
  25.     iobuf -> _nleft = 0;
  26.     return iobuf -> _fd;
  27. }
  28.  
  29. int fcreat(name,iobuf)
  30. char *name;
  31. struct iobuffer *iobuf;
  32. {
  33.     if (dskcheck(setjmp(dskerr)) || (iobuf -> _fd = creat(name)) < 0 ) return FAIL;
  34.     iobuf -> _nextp = iobuf -> _buff;
  35.     iobuf -> _nleft = (NSECTS * SECSIZ);
  36.     return iobuf -> _fd;
  37. }
  38.  
  39. int fflush(iobuf)    /*does NOT allow more writing*/
  40. struct iobuffer *iobuf;
  41. {
  42.     int i;
  43.  
  44.     if (iobuf -> _nleft == (NSECTS * SECSIZ)) return YES;
  45.  
  46.     i = NSECTS - iobuf->_nleft / SECSIZ;
  47.     if (dskcheck(setjmp(dskerr)) || write(iobuf -> _fd, iobuf -> _buff, i) != i) return FAIL;
  48.     return YES;
  49. }
  50.  
  51. int fclose(iobuf)
  52. struct iobuffer *iobuf;
  53. {
  54.     if (dskcheck(setjmp(dskerr))) return FAIL;
  55.     return close(iobuf -> _fd);
  56. }
  57.  
  58. putc(c,iobuf)    /*stripped down version of standard putc*/
  59. char c;
  60. struct iobuffer *iobuf;
  61. {
  62.     if (iobuf -> _nleft--) return *iobuf -> _nextp++ = c;
  63.     if (dskcheck(setjmp(dskerr)) || (write(iobuf -> _fd, iobuf -> _buff, NSECTS)) != NSECTS) return FAIL;
  64.     iobuf -> _nleft = (NSECTS * SECSIZ -1);
  65.     iobuf -> _nextp = iobuf -> _buff;
  66.     return *iobuf -> _nextp++ = c;
  67. }
  68.  
  69. int getc(iobuf)    /*the standard getc, trimmed for speed*/
  70. struct iobuffer  *iobuf;
  71. {
  72.     int nsecs;
  73.  
  74.     if (iobuf -> _nleft--) return *iobuf -> _nextp++;
  75.     if (dskcheck(setjmp(dskerr)) || (nsecs = read(iobuf -> _fd, iobuf -> _buff, NSECTS)) <= 0)
  76.         return iobuf -> _nleft++;
  77.     iobuf -> _nleft = nsecs * SECSIZ - 1;
  78.     iobuf -> _nextp = iobuf -> _buff;
  79.     return *iobuf->_nextp++;
  80. }
  81.  
  82. funlink(name)
  83. char *name;
  84. {
  85.     if (dskcheck(setjmp(dskerr))) return FAIL;
  86.     return unlink(name);
  87. }
  88.  
  89. frename(oldname,newname)
  90. char *oldname,*newname;
  91. {
  92.     if (dskcheck(setjmp(dskerr))) return FAIL;
  93.     return rename(oldname,newname);
  94. }
  95.  
  96. dskcheck(errtype)
  97. int errtype;
  98. {
  99.     switch(errtype) {
  100.     case 0: 
  101.         return 0;
  102.     case 1: 
  103.         error("Bad sector"); 
  104.         break;
  105.     case 2: 
  106.         error("Bad disk select"); 
  107.         break;
  108.     case 3: 
  109.         error("Disk is read only"); 
  110.         break;
  111.     case 4: 
  112.         error("File is read only"); 
  113.         break;
  114.         }
  115.     bdos(RESETDSK);
  116.     bdos(SELDSK,curdsk);
  117.     return FAIL;
  118. }
  119.  
  120. err1()
  121. {
  122.     longjmp(dskerr,1);
  123. }
  124.  
  125. err2()
  126. {
  127.     longjmp(dskerr,2);
  128. }
  129.  
  130.  
  131. err3()
  132. {
  133.     longjmp(dskerr,3);
  134. }
  135.  
  136. err4()
  137. {
  138.     longjmp(dskerr,4);
  139. }
  140. me)) < 0 ) return FAIL;
  141.     iobuf -> _nextp = iobuf -> _buff;
  142.     iobuf -> _nleft = (NSECT